/**
 * 全站http配置
 *
 * axios参数说明
 */
import axios from "axios";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import { notification } from "ant-design-vue";
import { getAccessToken } from "@/util/auth";
import globalSite from "@/config/globalSite";
import { values } from "lodash";

// 默认超时时间
axios.defaults.timeout = 20000;
// 返回其他状态码
axios.defaults.validateStatus = function(status) {
  return status >= 200 && status <= 500;
};
// 跨域请求，允许保存cookie
axios.defaults.withCredentials = true;

// http request拦截
axios.interceptors.request.use(
  config => {
    if (getAccessToken()) config.headers["accessToken"] = getAccessToken();
    const configData = config;
    // 开启 progress
    NProgress.start();
    return configData;
  },
  error => {
    return Promise.reject(error);
  }
);
// http response 拦截
axios.interceptors.response.use(
  res => {
    // 关闭 progress
    NProgress.done();
    let resData = res;
    // ******  处理特殊的返回数据  ****** start
    if (resData.headers["content-type"]) {
      if (resData.headers["content-type"].indexOf("text/html") !== -1) {
        return resData.data;
      }
      if (
        resData.headers["content-type"].indexOf("application/vnd.ms-excel") !==
        -1
      ) {
        return resData; // 导出订单
      }
      if (
        resData.headers["content-type"].indexOf(
          "application/vnd.openxmlformats-officedocument"
        ) !== -1
      ) {
        return resData; // 导出实物库存
      }
      if (resData.headers["content-type"].indexOf("image/png") !== -1) {
        return resData.data;
      }
      if (
        resData.headers["content-type"].indexOf("application/octet-stream") !==
        -1
      ) {
        return resData;
      }
      if (
        resData.headers["content-type"].indexOf("application/x-msdownload") !==
        -1
      ) {
        return resData;
      }
    }
    // ******  处理特殊的返回数据  ****** end
    // 获取状态码
    const status = resData.status;
    const errCode = resData.data.code;
    const msg = resData.data.msg;
    // const verifyByPhone = globalSite.errorCode.verifyByPhone; // 需要进行手机验证
    // const companyNoAuth = globalSite.errorCode.companyNoAuth; // 企业未认证
    // const verifyhistorypremium = globalSite.errorCode.verifyhistorypremium; // 历史升贴水对比，差异较大
    // const caState = globalSite.errorCode.caState; // 企业未进行ca认证，需创建签署账号
    let errorCodeByNoShow = values(globalSite.errorCode); // 不需要显示报错的code
    // 如果请求为非200否者默认统一处理
    if (status !== 200) {
      notification.error({
        message: "错误",
        description: msg
      });
      return Promise.reject(new Error(msg));
    } else if (status === 200) {
      if (errCode === 0) {
        return Promise.resolve(resData.data.data);
      } else if (errorCodeByNoShow.indexOf(errCode) !== -1) {
        // 特殊code不需要显示错误信息
        return Promise.reject(resData.data);
        // } else if (errCode === verifyByPhone) {
        //   // 需要进行手机验证
        //   return Promise.reject(resData.data);
        // } else if (errCode === companyNoAuth) {
        //   // 企业未认证
        //   return Promise.reject(resData.data);
        // } else if (errCode === verifyhistorypremium) {
        //   // 历史升贴水对比，差异较大
        //   return Promise.reject(resData.data);
      } else {
        if (resData.data.code) {
          // 处理正常请求返回错误信息
          notification.error({
            message: "错误",
            description: msg
          });
        } else {
          // 处理流文件返回错误信息
          let reader = new FileReader();
          reader.onload = function() {
            let content = reader.result;
            let message = JSON.parse(content).msg; // 错误信息
            notification.error({
              message: "错误",
              description: message
            });
          };
          reader.readAsText(resData.data);
        }
        return Promise.reject(resData.data);
      }
    } else {
      notification.error({
        message: "错误",
        description: msg
      });
      return Promise.reject(new Error(msg));
    }
  },
  error => {
    NProgress.done();
    notification.error({
      message: "错误",
      description: error.msg
    });
    return Promise.reject(new Error(error));
  }
);

export default axios;
